#ifndef CONFIGIMPACTDETECTOR_H
#define CONFIGIMPACTDETECTOR_H

#include "systemconfig.h"
#include <QString>

/**
 * Martin Fowler重构：配置影响检测器
 *
 * 职责：检测系统配置变更是否需要重建缓存
 * 设计原则：
 * - Single Responsibility：专门负责配置影响分析
 * - KISS原则：只检测关键的两种影响（DPI + 缓存目录）
 * - Static Methods：无状态设计，简单直接
 */
class ConfigImpactDetector
{
public:
    /**
     * 重建类型枚举
     */
    enum class RebuildType {
        None,           // 无需重建
        DPIOnly,        // 仅DPI变更（直接更新，无需重新分页）
        CacheDirectory, // 缓存目录变更（需要重新处理所有文件）
        Both           // DPI和缓存目录都变更
    };

    /**
     * 重建需求结构
     */
    struct RebuildRequirement {
        RebuildType rebuildType;     // 重建类型
        QString reason;              // 变更原因（用于日志，不显示给用户）

        RebuildRequirement(RebuildType type = RebuildType::None, const QString& r = "")
            : rebuildType(type), reason(r) {}

        bool needsRebuild() const {
            return rebuildType != RebuildType::None;
        }

        bool isDPIOnly() const {
            return rebuildType == RebuildType::DPIOnly;
        }

        bool needsFullRebuild() const {
            return rebuildType == RebuildType::CacheDirectory || rebuildType == RebuildType::Both;
        }
    };

    /**
     * Martin Fowler重构：Extract Method - 配置变更影响分析
     *
     * 分析两个配置之间的差异，确定是否需要重建缓存
     *
     * @param oldConfig 旧配置
     * @param newConfig 新配置
     * @return 重建需求分析结果
     */
    static RebuildRequirement analyzeConfigChange(
        const SystemConfig& oldConfig,
        const SystemConfig& newConfig
    );

private:
    // Martin Fowler重构：Extract Method - 具体检测逻辑分离
    static bool isDPIChanged(const SystemConfig& oldConfig, const SystemConfig& newConfig);
    static bool isCacheDirectoryChanged(const SystemConfig& oldConfig, const SystemConfig& newConfig);
    static QString buildChangeReason(bool dpiChanged, bool cachePathChanged);
};

#endif // CONFIGIMPACTDETECTOR_H